var table;
layui.use(['form','layer','table'], function () {
    var $ = layui.jquery,
        form = layui.form;
    table = layui.table;
    // 菜单列表
    var tableIns = table.render({
        elem: '#menuList',
        url : '../../menus/',
        method:'GET',
        cellMinWidth : 95,
        page : true,
        height : 'full-125',
        limit : 10,	// 注意：请务必确保 limit 参数（默认：10）是与你服务端限定的数据条数一致
        limits : [10,15,20,25],	// 分页选择
        id : 'menuListTable',
        cols : [[
            {type: 'checkbox', fixed:'left', width:50},
            {field: 'menuName', title: '菜单名称', width:350},
            {field: 'menuPath', title: '菜单路径', align:'center'},
            {field: 'status', title: '状态', align:'center', templet: function(d){
                    return '<input type="checkbox" name="status" lay-filter="roleStatus" '
                        +'lay-skin="switch" lay-text="正常|失效" '+(d.status==1?"checked":"")
                        +' qs-id='+d.id+'>';
                }},
            {title: '操作', width:200, templet:'#menuListBar',fixed:'right',align:'center'}
        ]]
    });

    // 检索功能
    $(".search_btn").on("click",function(){
        table.reload("menuListTable",{
            page: {
                curr: 1 // 重新从第1页开始
            },
            where: {
                menuName: $(".searchVal").val()  // 搜索关键字
            }
        })
    });
})

var zTreeObj;

var setting = {
    view: {
        addHoverDom: addHoverDom,
        removeHoverDom: removeHoverDom,
        selectedMulti: false
    },
    data: {
        simpleData: {
            enable: true,
            idKey: "uuid",
            pIdKey: "pid",
            rootPId: "-1"
        }
    },
    edit: {
        enable: true,
        editNameSelectAll: true,
        showRemoveBtn: showRemoveBtn,
        showRenameBtn: showRenameBtn

    },
    callback: {
        beforeRemove: beforeRemove,    // 用于捕获节点被删除之前的事件回调函数，并且根据返回值确定是否允许删除操作
        onRemove: onRemove,    // 用于捕获删除节点之后的事件回调函数。
        beforeRename: beforeRename, // 用于捕获节点编辑名称结束（Input 失去焦点 或 按下 Enter 键）之后，
        // 更新节点名称数据之前的事件回调函数，并且根据返回值确定是否允许更改名称的操作
        onRename: onRename,    // 用于捕获节点编辑名称结束之后的事件回调函数
        onClick: onClick
    }

};
// zTree 的数据属性，深入使用请参考 API 文档（zTreeNode 节点数据详解）
var zNodes = [];

$(document).ready(function () {
    getNodesMethod();
    zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes);
    var nodes = zTreeObj.getNodes();
    if (nodes.length>0) {
        zTreeObj.expandNode(nodes[0], true, true, true);
    }
});


function showRemoveBtn(treeId, treeNode) {
    return !(treeNode.uuid == 0);
}

function showRenameBtn(treeId, treeNode) {
    return !(treeNode.uuid == 0);
}

function beforeRemove(treeId, treeNode) {
    return confirm("确认删除 节点 -- " + treeNode.name + " 吗？");
}

function beforeRename(treeId, treeNode, newName, isCancel) {
    //新名称为空时提示名称不能为空
    if (newName.length == 0) {
        setTimeout(function () {
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            zTree.cancelEditName();
            alert("节点名称不能为空.");
        }, 200);
        return false;
    }

    var Cnodes = getPeerNodes(treeNode);
    //获取当前节点的同级兄弟节点，不包含本节点
    function getPeerNodes(targetNode) {
        if (targetNode == null) {
            return null;
        } else {
            if (targetNode.getParentNode() != null) {
                return targetNode.getParentNode().children;
            }
            return null;
        }
    }
    for (var n in Cnodes) {
        if (Cnodes[n].name == newName) {
            if (Cnodes[n].uuid == treeNode.uuid) return;
            setTimeout(function () {
                //var zTree = $.fn.zTree.getZTreeObj("treeDemo");
                //zTree.cancelEditName();
                alert("节点名称已存在！");
            }, 200)
            return false;
        }
    }
    return true;
}

function onRemove(event, treeId, treeNode) {
    removeMethod(treeNode)
}

function onRename(event, treeId, treeNode, isCancel) {
    console.log(treeNode)
    renameMethod(treeNode)
}

function onClick(event, treeId, treeNode){
    table.reload("menuListTable",{
        page: {
            curr: 1 // 重新从第1页开始
        },
        where: {
            pid: treeNode.uuid  // 搜索关键字
        }
    })
}

// 用于当鼠标移动到节点上时，显示用户自定义控件，显示隐藏状态同 zTree 内部的编辑、删除按钮
var newCount = 1;
function addHoverDom(treeId, treeNode) {
    var sObj = $("#" + treeNode.tId + "_span");
    if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;
    var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
        + "' title='add node' onfocus='this.blur();'></span>";
    sObj.after(addStr);
    var btn = $("#addBtn_" + treeNode.tId);
    if (btn) btn.bind("click", function () {
        var zTree = $.fn.zTree.getZTreeObj("treeDemo");
        // 新增的节点（随机uuid，并继承父类的uuid）
        var newTreeNode = {uuid: UUIDUtils.uuid(), pid: treeNode.uuid, name: "new node" + (newCount++)}
        zTree.addNodes(treeNode, newTreeNode);
        increaseMethod(newTreeNode);
        return false;
    });
};

// 用于当鼠标移出节点时，隐藏用户自定义控件，显示隐藏状态同 zTree 内部的编辑、删除按钮
function removeHoverDom(treeId, treeNode) {
    $("#addBtn_" + treeNode.tId).unbind().remove();
};

/**
 * 取得菜单树节点
 */
function getNodesMethod() {
    $.ajax({
        url: "../../menus/menuTree",
        type: "GET",
        async: false,
        success: function (data) {
            zNodes = JSON.parse(data);
            console.log(zNodes);
        },
        error: function (res) {
            layer.msg("数据获取失败");
            return false;
        }
    })
}

/**
 * 增加菜单节点
 * @param treeNode
 */
function increaseMethod(treeNode){
    $.ajax({
        url : "../../menus/treeNode",
        type : "POST",
        async : false,
        data : treeNode,
        success: function (data) {
            zNodes = data;
        },
        error: function (res) {
            layer.msg("新增失败");
            return false;
        }
    })
}

/**
 * 菜单重命名
 * @param treeNode
 */
function renameMethod(treeNode) {
    $.ajax({
        url: "../../menus/treeNode",
        type: "PUT",
        async: false,
        data: treeNode,
        success: function (data) {
            zNodes = data;
        },
        error: function (res) {
            layer.msg("修改失败");
            return false;
        }
    })
}

/**
 * 菜单删除
 * @param treeNode
 */
function removeMethod(treeNode) {
    $.ajax({
        url: "../../menus/" + treeNode.uuid,
        type: "DELETE",
        async: false,
        success: function (data) {
            zNodes = data;
        },
        error: function (res) {
            layer.msg("删除失败");
            return false;
        }
    })
}
